7 提升方法

参考这篇笔记了解 bagging&boosting 的基本概念. 在分类问题中, boosting 可以改变训练样本的权重, 学习多个分类器, 将他们进行线性组合.

1 AdaBoost 算法

1.1 基本思路

在满足 PAC 可学习性时, 我们可以定义

事实上可以证明, 强可学习和弱可学习等价, 因此我们需要把弱可学习 boost 为强可学习. 对于分类问题, 我们可以先学习一系列弱学习算法, 然后组合它们, 构成一个强分类器. AdaBoost 会每轮提高前一轮误分类样本的权值, 采取加权多数表决的方法.

1.2 AdaBoost 算法

依然假设训练集形如 T={(x1,y1),,(xN,yN)}, 其中 xiXRn,yiY={1,+1}.

AdaBoost 算法

输入 T; 弱学习算法.
输出 最终分类器 G(x).

  1. 初始化权值分布 D1: D1=(ω11,,ω1i,,ω1N),ω1i=1N,i=1,,N.
  2. 对于 m=1,,M:
    1. 使用权值分布为 Dm 的训练集学习, 得到基本分类器 Gm(x):X{1,+1}.
    2. 计算 Gm(x) 的分类误差率 em=i=1NP(Gm(xi)yi)=i=1Nωmi1{Gm(xi)yi}.
    3. 计算 Gm(x) 的系数 αm=12log1emem.
    4. 更新权值分布 Dm+1=(ωm+1,1,,ωm+1,i,,ωm+1,N),ωm+1,i=1Zmωmiexp(αmyiGm(xi)),Zm=i=1Nωmiexp(αmyiGm(xi)).
  3. 得到最终分类器f(x)=m=1MαmGm(x),G(x)=sgn(f(x)).

2 训练误差分析

定理 2.1 (AdaBoost 训练误差边界)

(2.1)1Ni=1N1{G(xi)yi}1Ni=1Nexp(yif(xi))=m=1MZm.

定理 2.2 (二分类问题的训练误差边界)

(2.2)m=1MZm=m=1M[2em(1em)]=m=1M14γm2exp(2m=1Mγm2).

其中 γm=12em.

推论

如果 γ>0,m:γmγ, 则 (2.4)1Ni=1N1{G(xi)yi}exp(2Mγ2).

这说明 AdaBoost 的训练误差是指数级下降的.

3 算法解释

3.1 前向分步算法 (Forward Stagewise Algorithm)

训练集 T 同前. 考虑加法模型 (3.1)f(x)=m=1Mβmb(x;γm), 这里 b(x;γm) 为基函数, γm 为参数, βm 为系数. 给定训练数据和损失函数 L(y,f(x)), 只需要考虑最小化问题 minβm,γmi=1NL(yi,m=1Mβmb(xi;γm)).
这是一个复杂的优化问题. 但是前向分步算法希望每步只学习一个基函数, 简化优化复杂度. 也即, 每步优化 minβ,γi=1NL(yi;βb(xi;γ)).

前向分步算法

输入 T, L(y,f(x)), {b(x;γ)}.
输出 加法模型 f(x).

  1. 初始化 f0(x)=0.
  2. m=1,,M:
    1. 极小化损失函数 (βm,γm)=argminβ,γi=1ML(yi,fm1(xi)+βb(xi;y)), 得到 βm,γm.
    2. 更新 fm(x)=fm1(x)+βmb(x;γm).
  3. 得到加法模型 f(x)=fM(x)=m=1Mβmb(x;γm).

3.2 前向分步算法与 AdaBoost

下面的定理指出前向分步算法可以推出 AdaBoost.

定理 3.1

AdaBoost 算法是基本分类器组成的加法模型, 损失函数是指数函数, 因此是前向分步算法的特例.

4 提升树

基于分类树或者回归树基本分类器, 用前向分步算法得到的模型称为提升树 (Boosting Tree), 它是统计学习中性能最好的方法之一.

4.1 提升树模型

T(x;Θm) 表示决策树, Θm 为参数, M 为数的个数, 则提升树模型可以表示为 (4.1)fM(x)=m=1MT(x;Θm).

4.2 提升树算法

代入前向分步算法, 得到fm(x)=fm1(x)+T(x;Θm),(4.2)Θ^m=argminΘmi=1NL(yi,fm1(xi)+T(xi;Θm)).
对于二分类问题, 将 Gm(x) 限制为二分类树即可, 这就是 AdaBoost 算法的特殊情况. 接下来讨论回归问题的提升树.
现在对于 T, 需要更改 yiYR. 回顾回归树, 将 X 划分为 J 个不相交的区域 R1,,RJ, 在每个区域上确定输出的常量 cj, 则 (4.3)T(x;Θ)=j=1Jcj1{xRj}, 其中 Θ={(R1,c1),,(RJ,cJ)}, J 就是树的叶节点个数.

如果采用平方误差损失函数 L(y,f(x))=(yf(x))2, 则代入 (4.2) L(y,fm1(x)+T(x;Θm))=[rT(x;Θm)]2, 这里 r=yfm1(x) 是当前拟合数据的残差. 所以, T 的目标仅仅是拟合当前模型的残差.

回归问题的提升树算法

输入 T
输出 fM(x)

  1. 初始化 f0(x)=0.
  2. m=1,,M,
    1. 按 (4.3) 计算残差 rmi=yifm1(xi),1iN.
    2. 拟合 rmi 学习回归树 T(x;Θm).
    3. 更新 fm(x)=fm1(x)+T(x;Θm).
  3. 得到 fM(x)=m=1MT(x;Θm).

4.3 梯度提升

对于一般损失函数, 每一步的优化可能并非像平方损失函数那样容易. 因此, 可以使用梯度提升 (gradient boosting), 关键是利用损失函数的负梯度在当前模型的取值 [L(y,f(xi))f(xi)]|f(x)=fm1(x).

梯度提升算法

输入 T, L(y,f(x)).
输出 回归树 f^(x).

  1. 初始化 f0(x)=argminci=1NL(yi,c).
  2. m=1,,M,
    1. n=1,,N, 计算 rmi=[L(y,f(xi))f(xi)]|f(x)=fm1(x).
    2. rmi 拟合回归树, 得到第 m 棵树对叶结点区域为 Rmj,1jJ.
    3. j=1,,J, 计算 cmj=argmincxiRmjL(yi,fm1(xi)+c).
    4. 更新 fm(x)=fm1(x)+j=1Jcmj1{xRmj}.
  3. 得到回归树 f^(x)=fM(x)=m=1Mj=1Jcmj1{xRmj}.